home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oh!X 2000 Spring
/
Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).7z
/
Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).bin
/
F2JW
/
trans
/
special.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1999-08-22
|
47KB
|
1,684 lines
//
// フランス語 → 日本語 翻訳プログラム
//
// 文章構成 解析部(その2)
#include "stdafx.h"
#include <string.h>
#include <ctype.h>
#include "f2j.h"
#include "myprot.h"
extern TOKEN *lastToken;
extern TOKEN *currentTree;
extern ADVERB dic_adverb_NE;
extern BOOL isChanged;
extern PREPOSITION dic_DeInf[];
extern PREPOSITION dic_among[];
extern JP_PREPOSITION dic_jpr_de[];
extern FR_QUESTION dic_Quel[];
extern CMP_TOKEN pat_QueDeFois[];
JP_PRONOUN dic_JpPronoun_Leur[] = {
JP_PRONOUN(
FR_ATTRIB_ALL, FR_ATTRIB_NONE,
JP_PROP_ALL, JP_PROP_NONE,
NULL,
"(彼/女/それ)ら", JP_EMPHASIS_NONE, FR_PART_NOUN_OBJECT_I,
FR_ATTRIB_ILS, JP_PROP_HUMAN, JP_UNIT_NONE
)
};
// ne le leur donnez pas.
PRONOUN dic_pronoun_Leur = {
"leur",
FR_ATTRIB_ILS, FR_SHORT_NONE,
JPPRONOUN_DIC(dic_JpPronoun_Leur)
};
//
// Pass1ではわからなかった品詞を細かく再考
//
void
ProcessSpecialWord1(TOKEN *start)
{
TOKEN *prev = start;
TOKEN *p = prev->next;
while(p && !isChanged) {
switch(p->frPart) {
case FR_PART_SPECIAL_AUSSI: Process_AUSSI(start, prev, p); break;
case FR_PART_SPECIAL_CE: Process_CE(start, prev, p); break;
case FR_PART_SPECIAL_COMME: Process_COMME(start, prev, p); break;
// case FR_PART_SPECIAL_D: Process_D(start, prev, p); break;
case FR_PART_SPECIAL_DE: Process_DE(start, prev, p); break;
case FR_PART_SPECIAL_GRACE: Process_GRACE(start, prev, p);
case FR_PART_SPECIAL_DES: Process2_DES(start, prev, p); break;
case FR_PART_SPECIAL_EN: Process_EN(start, prev, p); break;
case FR_PART_SPECIAL_EST: Process_EST(p); break;
case FR_PART_SPECIAL_FOIS: Process_FOIS(start, prev, p); break;
case FR_PART_SPECIAL_LA: Process_LA(start, prev, p); break;
case FR_PART_SPECIAL_LEUR: Process_LEUR(start, prev, p); break;
case FR_PART_SPECIAL_LEQUEL: Process_LEQUEL(start, prev, p); break;
case FR_PART_SPECIAL_MEME: Process_MEME(start, prev, p); break;
case FR_PART_SPECIAL_MOINS: Process_MOINS(start, prev, p); break;
case FR_PART_SPECIAL_NI: Process_NI(start, prev, p); break;
case FR_PART_SPECIAL_NIMPORTE: Process_NIMPORTE(start, prev, p); break;
case FR_PART_SPECIAL_PEU: Process_PEU(start, prev, p); break;
case FR_PART_SPECIAL_QUAND: Process_QUAND(start, p); break;
case FR_PART_SPECIAL_QUI: Process_QUI(start, prev, p); break;
case FR_PART_SPECIAL_QUOI: Process_QUOI(start, prev, p); break;
case FR_PART_SPECIAL_QUE: Process_QUE(start, prev, p); break;
case FR_PART_SPECIAL_OU: Process_OU(start, prev, p); break;
case FR_PART_SPECIAL_PLUS: Process_PLUS(start, prev, p); break;
case FR_PART_SPECIAL_COMMA: Process_COMMA(start, prev, p); break;
case FR_PART_SPECIAL_S: Process_S(start, p); break;
case FR_PART_SPECIAL_SI: Process_SI(start, p); break;
case FR_PART_SPECIAL_SEULEMENT:Process_SEULEMENT(start, p); break;
case FR_PART_SPECIAL_TOUT: Process_TOUT(start, prev, p); break;
}
prev = p;
p = p->next;
}
}
CMP_TOKEN patAussi1[] = {
// j'ai aussi voiture.
// CMP_TOKEN( FR_PART_NOUN_ALL, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_VERB_UNCLEAR, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_SPECIAL_AUSSI, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NONE)
};
//
// "aussi"を見分ける
// 副詞
void
Process_AUSSI(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(IsObjectMatch(prev, FR_PART_SENTENCE_ALL)) {
DisconnectTOKEN(start, p);
if(prev->object1) {
TOKEN *subject = prev->object1;
subject->jpEmphasis |= JP_EMPHASIS_MO;
}
return;
}
if(IsPatternMatch(patAussi1, prev)) {
DisconnectTOKEN(start, p);
prev->jpEmphasis |= JP_EMPHASIS_MO;
return;
}
// je vais aussi (en Italie et en Espagne).
if(next
&& (next->frPart & FR_PART_COMBINE)) {
DisconnectTOKEN(start, p);
next->jpEmphasis |= JP_EMPHASIS_MO;
}
}
//
// 'ce'を見分ける
// 主語代名詞、指示形容詞
//
void
Process_CE(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if((prev->frPart & FR_PART_VERB) && prev->punctuation == FR_PUNCT_HYPHEN) {
// quelle fleur est-<ce> ?
ChangeToPronoun(p, "ce");
return;
}
if(next == NULL) return;
if(next->frPart & FR_PART_VERB) {
ChangeToPronoun(p, "ce");
} else if((next->frPart & FR_PART_ADJECTIVE)
|| (next->frPart & FR_PART_NOUN)) {
// 指示形容詞
ChangeToProadjective(p, "ce");
} else if(next->frPart == FR_PART_SPECIAL_QUE
|| next->frPart == FR_PART_SPECIAL_QUOI) {
// vous ferez <ce> que je vous dis.
ChangeToPronoun(p, "ce");
next->frPart = FR_PART_RELATIVE_OBJECT_N;
} else if(next->frPart == FR_PART_SPECIAL_QUI) {
// ce qui n'est pas clair n'est pas fran\ais.
ChangeToPronoun(p, "ce");
// next->frPart = FR_PART_RELATIVE_SUBJECT;
}
}
//
// ','を見分ける
//
void
Process_COMMA(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(next == NULL) return;
if(IsObjectMatch(prev, FR_PART_INDEPENDENCE_INTERJECTION)) {
ChangeToCombine(p, ",");
p->frPart = FR_PART_COMBINE_VERB;
#if 1
} else if((prev->frPart & FR_PART_COMBINE)
&& prev->object2 == NULL) {
// Mais, o| est les neiges d'antan?
DisconnectTOKEN(start, p);
next->punctuation = FR_PUNCT_COMMA;
} else if((next->frPart & FR_PART_COMBINE)
&& next->object1 == NULL) {
if(next->object2 != NULL) {
// , mais SV, , car SV
DisconnectTOKEN(start, p);
next->punctuation = FR_PUNCT_COMMA;
}
#endif
#if 1
// ProcessCombine1, ProcessCombine2とほぼ同様
// ただし、いったん、FR_PART_COMBINE_GENERALに変更すると、
// その分、候補が多くなってしまうので、自前で処理する
} else if(SearchToken(FR_PART_VERB, start, p)
&& (p->frPartChoice & FR_PART_VERB)
&& IsObjectMatch(next, FR_PART_VERB_ALL)) {
// 文章同士でも連結しない場合がある eg) d{s qu'il fut arriv{, elle sortit.
CopyCurrentTree(p, "Comma-1", FR_PART_VERB);
ChangeToCombine(p, ",");
p->frPart = FR_PART_COMBINE_VERB;
// FR_PART_VERBの連結は、FR_PART_SENTENCE_NO_SUBJECTを作ってから、行う
} else if(IsObjectMatch(prev, FR_PART_NOUN_ALL)
&& (p->frPartChoice & FR_PART_NOUN)
&& IsObjectMatch(next, FR_PART_NOUN_ALL)) {
CopyCurrentTree(p, "Comma 1", FR_PART_NOUN);
ChangeToCombine(p, ",");
p->frPart = FR_PART_COMBINE_NOUN;
} else if(IsObjectMatch(prev, FR_PART_ADJECTIVE_ALL)
&& (p->frPartChoice & FR_PART_ADJECTIVE)
&& IsObjectMatch(next, FR_PART_ADJECTIVE_ALL)) {
CopyCurrentTree(p, "Comma 2", FR_PART_ADJECTIVE);
ChangeToCombine(p, ",");
p->frPart = FR_PART_COMBINE_ADJECTIVE;
} else if(IsObjectMatch(prev, FR_PART_ADVERB_ALL)
&& (p->frPartChoice & FR_PART_ADVERB)
&& IsObjectMatch(next, FR_PART_ADVERB_ALL)) {
CopyCurrentTree(p, "Comma 3", FR_PART_ADVERB);
ChangeToCombine(p, ",");
p->frPart = FR_PART_COMBINE_ADJECTIVE; // FR_PART_COMBINE_ADVERBはない
} else if(SearchToken(FR_PART_PREPOSIT, start, p)
&& (p->frPartChoice & FR_PART_PREPOSIT)
&& IsObjectMatch(next, FR_PART_PREPOSIT)) {
CopyCurrentTree(p, "Comma 4", FR_PART_PREPOSIT);
ChangeToCombine(p, ",");
p->frPart = FR_PART_COMBINE_PREPOSIT;
#endif
}
}
//
// 'comme'を見分ける
// 接続詞、副詞(感嘆詞)、前置詞
//
void
Process_COMME(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(next == NULL) return;
if((SearchToken(FR_PART_VERB_ALL, p->next))
&& (currentTree->punctuation & FR_PUNCT_EXCLAMINATION)) {
TOKEN *altP = CopyCurrentTree(p, "Comme 2", FR_PART_ADVERB);
ChangeToProadverb(altP, "comme");
}
// ~として、 elle est excellente comme secr{taire.
// ~のように
// TOKEN *altP = CopyCurrentTree(p, "Comme 3", FR_PART_PREPOSIT);
ChangeToPreposition(p, "comme");
}
CMP_TOKEN pat_AdjDeNoun[] = {
// eloigne de la plage.
CMP_TOKEN( (FR_PART)(FR_PART_ADVERB_ALL | FR_PART_ADJECTIVE_ALL), JP_PROP_PLACE, NULL),
CMP_TOKEN( FR_PART_SPECIAL_DE, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NOUN_ALL, JP_PROP_PLACE, NULL),
CMP_TOKEN( FR_PART_NONE)
};
CMP_TOKEN pat_NounDePlus1[] = {
// il a deux ans de plus que moi.
CMP_TOKEN( FR_PART_NOUN_ALL, JP_PROP_UNIT, NULL),
CMP_TOKEN( FR_PART_SPECIAL_DE, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_SPECIAL_PLUS, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NONE)
};
CMP_TOKEN pat_NounDePlus2[] = {
// chose de meilleur.
CMP_TOKEN( FR_PART_NOUN_ALL, JP_PROP_UNIT, NULL),
CMP_TOKEN( FR_PART_SPECIAL_DE, JP_PROP_NONE, NULL),
CMP_TOKEN( (FR_PART)(FR_PART_ADJECTIVE_ALL | FR_PART_ADVERB_ALL), JP_PROP_NONE, IsCompare),
CMP_TOKEN( FR_PART_NONE)
};
CMP_TOKEN pat_NePasDuTout[] = {
// il n'est pas du tout malade.
CMP_TOKEN( FR_PART_SPECIAL_DE, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_ARTICLE_DEFINIT,JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_SPECIAL_TOUT, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NONE)
};
BOOL
IsNotSubject(TOKEN *p)
{
// Venez-(vous <de> Paris)? ()を防ぐ
if(!IsObjectMatch(p, FR_PART_NOUN_SUBJECT))
return(TRUE);
return(FALSE);
}
CMP_TOKEN pat_PNounDeNoun1[] = {
// celui de votre fr}re.
CMP_TOKEN((FR_PART)(FR_PART_NOUN_DEMONSTRATIVE | FR_PART_NOUN_OBJECT_BOTH | FR_PART_NOUN_INDEFINIT),
JP_PROP_NONE, IsNotSubject),
CMP_TOKEN( FR_PART_SPECIAL_DE, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NOUN_ALL, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NONE)
};
JP_COMBINE jpCombineDeSortQue[] = {
JP_COMBINE("%s1。それで、%s2", FR_PART_NONE,
FR_PART_SENTENCE_NORMAL,JP_PROP_NONE,
FR_PART_SENTENCE_ALL, JP_PROP_NONE
),
};
COMBINE combineDeSortQue =
{
"de sort que", FALSE, FR_PART_COMBINE_VERB, JPCOMBINE_DIC(jpCombineDeSortQue)
};
CMP_TOKEN pat_DeSorteQue[] = {
// elle n'est pas venue, de sorte que nous avons d~ changer notre projet.
CMP_TOKEN( FR_PART_SPECIAL_DE, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NOUN_GENERAL, "sorte"),
CMP_TOKEN( FR_PART_SPECIAL_QUE, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NONE)
};
// D'Autre
JP_PRONOUN dic_De_Autre[] = {
JP_PRONOUN( FR_ATTRIB_ALL, FR_ATTRIB_NONE,
JP_PROP_ALL, JP_PROP_NONE,
NULL,
"他の人", JP_EMPHASIS_NONE, FR_PART_NOUN_INDEFINIT,
FR_ATTRIB_ILS, JP_PROP_HUMAN, JP_UNIT_NONE
)
};
PRONOUN pronounDe_Autre = {
"de autre", FR_ATTRIB_JE, FR_SHORT_NONE, JPPRONOUN_DIC(dic_De_Autre)
};
//
// 'de'を見分ける
// 不定冠詞、部分冠詞、前置詞(infを導く)、形容詞をともなう冠詞、否定冠詞
void
Process_DE(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(next == NULL) return;
if(IsPatternMatch(pat_NounDePlus1, prev)) {
DisconnectTOKEN(start, p->next); // "plus"を削除
DisconnectTOKEN(start, p); // "de"を削除
prev->frAttrib = (FR_ATTRIB)(prev->frAttrib | FR_ATTRIB_PLUS);
return;
}
if(IsPatternMatch(pat_NounDePlus2, prev)) {
TOKEN *adj = p->next;
DisconnectTOKEN(start, adj); // "meilleur"を削除
DisconnectTOKEN(start, p); // "de"を削除
AddChildTOKEN(prev, adj);
return;
}
if((prev->jpProp & JP_PROP_NEGATIVE)
&& IsPatternMatch(pat_NePasDuTout, p)) { // il n'est pas du tout malade.
ChangeToAdverb(next->next, "tout");
DisconnectTOKEN(start, next); // "de"を削除 du = de + le
DisconnectTOKEN(start, p); // "le"を削除 du = de + le
return;
}
if(IsPatternMatch(pat_PNounDeNoun1, prev)) { // celui de votre fr}re.
ChangeToPreposition(p, "de");
p->frPartParent = FR_PART_NOUN;
return;
}
if(IsPatternMatch(pat_DeSorteQue, p)) { // de sorte que
ChangeToCombine(p, &combineDeSortQue);
DisconnectTOKEN(start, p->next->next); // "que"を削除
DisconnectTOKEN(start, p->next); // "sorte"を削除
return;
}
if(IsObjectMatch(next, FR_PART_ADJECTIVE_ALL, JP_PROP_NONE, NULL, "autre") // D'autre
&& (next->next == NULL || !(next->next->frPart & FR_PART_NOUN))) {
ChangeToPronoun(next, &pronounDe_Autre);
DisconnectTOKEN(start, p); // "de"を削除
return;
}
// 不定詞を導く前置詞
if((next->frPart & FR_PART_VERB)
&& (next->frTense & FR_TENSE_ORIGIN)) {
ChangeToPreposition(p, dic_DeInf);
return;
}
// 冠詞(部分冠詞, des + 形容詞 + 複数名詞、否定冠詞)
if((!(prev->frPart & FR_PART_NOUN) || (prev->frPart & FR_PART_COMBINE))
&& (p->frPartChoice & FR_PART_ARTICLE)
&& IsObjectMatch(next, FR_PART_NOUN_ALL)) {
p->frPartChoice = (FR_PART)(p->frPartChoice & ~FR_PART_ARTICLE);
if(ProcessArticleDe(start, p, next)) return;
}
if(((prev->frPart & FR_PART_COMBINE) || !(prev->frPart & FR_PART_PREPOSIT))
&& (p->frPartChoice & FR_PART_PREPOSIT)) {
// 前置詞の可能性
if(IsPatternMatch(pat_AdjDeNoun, prev)) {
ChangeToPreposition(p, "de");
} else if(! SearchToken(FR_PART_SPECIAL_DE, p->next)) {
// 後ろから解析する eg) la maison de (frere de Marie).
ProcessPrepositionDe(start, prev, p, next);
}
}
}
//
// 冠詞としての"de"を検討
// 部分冠詞, des + 形容詞 + 複数名詞、否定冠詞
//
BOOL
ProcessArticleDe(TOKEN *start, TOKEN *p, TOKEN *noun)
{
TOKEN *article = SearchToken(FR_PART_ARTICLE_DEFINIT, noun->child);
if(!IsObjectMatch(noun, FR_PART_NOUN_GENERAL))
return(FALSE);
if(!(noun->frAttrib & FR_ATTRIB_PLURAL) // de + lesはない
&& article
&& !SearchToken(FR_PART_ARTICLE_PARTIAL, noun->child)
&& !SearchToken(FR_PART_ARTICLE_INFINIT, noun->child)) {
// 部分冠詞
if(!(noun->jpProp & JP_PROP_PARTIAL)) // 問答無用
MakeOtherChoiceDe(p, FR_PART_ARTICLE, "De 1");
ChangeToArticle(article, "de");
article->frPart = FR_PART_ARTICLE_PARTIAL;
// p->frAttrib = next->frAttrib;
DisconnectTOKEN(start, p); // de + la -> 一つの単語として扱う
} else if((noun->frAttrib & FR_ATTRIB_PLURAL)
&& SearchToken(FR_PART_ADJECTIVE_GENERAL_F, noun->child)
&& SearchToken(FR_PART_ADJECTIVE_POSSESIVE, noun->child) == NULL // 所有形容詞がつく時は冠詞は使わない
&& SearchToken(FR_PART_ARTICLE_ALL, noun->child) == NULL) {
// des petites revues -> <de> petites revues.
MakeOtherChoiceDe(p, FR_PART_ARTICLE, "De 2");
ChangeToArticle(p, "des");
} else if(SearchNegativeToken(start, p)
&& SearchToken(FR_PART_ARTICLE_ALL, noun->child) == NULL) {
// 否定冠詞
MakeOtherChoiceDe(p, FR_PART_ARTICLE, "De 3");
ChangeToArticle(p, "de");
p->frPart = FR_PART_ARTICLE_NEGATIVE;
} else
return(FALSE);
return(TRUE);
}
//
// 前置詞としての"de"を検討
// 部分冠詞, des + 形容詞 + 複数名詞、否定冠詞
//
BOOL
ProcessPrepositionDe(TOKEN *start, TOKEN *prev, TOKEN *p, TOKEN *next)
{
static TOKEN dummy;
BOOL savIsChanged = isChanged;
ChangeToPreposition(&dummy, "de"); // 試しに代えてみて
if(MatchPrepositionObject(&dummy, next) == NULL) {
isChanged = savIsChanged; // 駄目だったら、元に戻す。
return(FALSE);
}
TOKEN *altP = MakeOtherChoiceDe(p, FR_PART_PREPOSIT, "De 5");
ChangeToPreposition(p, "de");
// 最上位比較級の<de>?
if(IsWordOwner(prev, (FR_ATTRIB)(FR_ATTRIB_TOP | FR_ATTRIB_ONE_OF))
&& SearchToken(FR_PART_PREPOSIT_DE_AMONG, prev->child) == NULL) {
for(TOKEN *q = start; q; q = q->next) {
if(q->frPart == FR_PART_PREPOSIT_DE_AMONG) break;
}
if(q == NULL)
ChangeToPreposition(p, dic_among);
}
return(TRUE);
}
//
// "De"の別候補Treeを必要なら作成
//
TOKEN
*MakeOtherChoiceDe(TOKEN *p, FR_PART mask, char *s)
{
FR_PART choice = (FR_PART)(p->frPartChoice & ~mask);
if((choice & FR_PART_ARTICLE)
|| (choice & FR_PART_PREPOSIT)) {
TOKEN *altP = CopyCurrentTree(p, s);
altP->frPartChoice = choice;
return(altP);
}
return(NULL);
}
TOKEN
*SearchNegativeToken(TOKEN *start, TOKEN *end)
{
TOKEN *p;
for(p = start; p && p != end; p = p->next) {
if(p->jpProp & JP_PROP_NEGATIVE) return(p);
}
return(NULL);
}
static JP_PREPOSITION jp_GraceA[] = {
JP_PREPOSITION( "%1Nおかげ", JP_KIND_RENTAISHI,
JP_PROP_CONDITION,
CMP_TOKEN ( FR_PART_SENTENCE_ALL),
CMP_TOKEN ( FR_PART_NOUN_ALL)
),
};
PREPOSITION fr_GraceA[] = {
{ "gr`ce_A", FR_PART_PREPOSIT_GRACE_A, JPPREPOSIT_DIC(jp_GraceA) },
};
//
// 'grace'を見分ける
// 名詞、前置詞(Grance a ~ ~のおかげで)
void
Process_GRACE(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(next
&& next->frPart == FR_PART_PREPOSIT_A) {
ChangeToPreposition(p, fr_GraceA);
DisconnectTOKEN(start, next);
} else {
ChangeToNoun(p, "gr@ce");
}
}
//
// 'l@'を見分ける
// 副詞、後置指示形容詞(この voiture-l@)
void
Process_LA(TOKEN *start, TOKEN *prev, TOKEN *p)
{
if(p->next
&& (p->punctuation & FR_PUNCT_HYPHEN)
&& IsTokenFrench(p->next, "bas")) {
// l@-bas?
ChangeToAdverb(p, "l@-bas");
DisconnectTOKEN(start, p->next);
} else if(prev
&& IsObjectMatch(prev, (FR_PART)(FR_PART_NOUN_GENERAL | FR_PART_NOUN_DEMONSTRATIVE))
&& (prev->punctuation & FR_PUNCT_HYPHEN)) {
ChangeToProadjective(p, "l@");
} else if(p->punctuation & FR_PUNCT_HYPHEN) {
currentTree->prtControl = PRT_CONTROL_DISABLE;
}else {
ChangeToAdverb(p, "l@");
}
};
//
// 'leur'を見分ける
// 所有形容詞、間接目的代名詞
void
Process_LEUR(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(next == NULL) return;
// 所有形容詞
if(next->frPart & FR_PART_NOUN) {
ChangeToProadjective(p, "leur");
AttachAdjective(start, next, p, FR_LOCATION_FRONT);
return;
}
// 間接目的代名詞
if(IsObjectMatch(next, FR_PART_VERB_UNCLEAR)
|| next->frPart == FR_PART_ADVERB_Y
|| next->frPart == FR_PART_SPECIAL_EN) {
ChangeToPronoun(p, &dic_pronoun_Leur);
return;
}
PrintInternalError( "この<leur>はまったよーん\n");
}
//
// 'lequel'を見分ける
// 接続詞
void
Process_LEQUEL(TOKEN *start, TOKEN *prev, TOKEN *p)
{
if(start == prev // 先頭にあるということは、疑問代名詞に確定
|| IsObjectMatch(prev, FR_PART_SPECIAL_COMMA)) { // Quand vous parle de ces hommes, duquel parlez-vous?
ChangeToQuestion(p, ((SPECIALWORD *)p->what)->french);
return;
}
if((prev->frPart & FR_PART_NOUN)
&& p->preposition) {
p->frPart = FR_PART_RELATIVE_OBJECT_N;
// 主格でないので、必ず次に主語が必要 eg) adresse auxquelles vous {crirez.
if(p->next && IsObjectMatch(p->next, FR_PART_NOUN_OBJECT_BOTH)) {
p->next->frPart = (FR_PART)(p->next->frPart & ~FR_PART_NOUN_OBJECT_BOTH);
p->next->frPart = (FR_PART)(p->next->frPart | FR_PART_NOUN);
}
isChanged = TRUE;
}
}
//
// 'moins'を見分ける
// plus S+V, <moins> S+V
// (比較級は、CombinePlusAdjectiveで処理されている)
//
void
Process_MOINS(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
// Il l'est moins.
if(next == NULL) {
ChangeToAdverb(p, "moins");
return;
}
if( next
&& IsObjectMatch(next, FR_PART_SENTENCE_ALL)) {
// plus S+V, <moins> S+V
ChangeToAdverb(p, "moins");
return;
}
}
//
// 'memel'を見分ける
// 形容詞、代名詞、副詞
void
Process_MEME(TOKEN *start, TOKEN *prev, TOKEN *p)
{
if(IsObjectMatch(prev, FR_PART_NOUN_PERSONAL)
&& (prev->punctuation & FR_PUNCT_HYPHEN)) {
// moi-memes 自分自身
DisconnectTOKEN(start, p);
prev->jpEmphasis = JP_EMPHASIS__MEME;
return;
}
if(IsObjectMatch(prev, FR_PART_NOUN_ALL)) {
// ~でさえ、
// ses ennemis m]mes ne pouvaient lui refuser du talent.
DisconnectTOKEN(start, p);
prev->jpEmphasis = JP_EMPHASIS_MEME;
return;
}
if(p->next
&& IsObjectMatch(p->next, FR_PART_NOUN_ALL)) {
ChangeToAdjective(p, *(char **)p->what);
return;
}
// 不定冠詞の後は、不定代名詞
// Ils restent les m]mes.
if(IsObjectMatch(prev, FR_PART_ARTICLE_DEFINIT)) {
ChangeToPronoun(p, "m]me");
DisconnectTOKEN(start, p);
return;
}
if(p->frAttrib & FR_ATTRIB_SINGLE)
ChangeToAdverb(p, "m]me");
}
//
// 'ni'を見分ける
// je n'ai <ni> p}re <ni> m}re.
// 無視 接続詞
void
Process_NI(TOKEN *start, TOKEN *prev, TOKEN *p)
{
if(p
&& p->next
&& p->next->next
&& p->next->next->frPart == FR_PART_SPECIAL_NI) {
TOKEN *ni2 = p->next->next;
p->next->jpEmphasis |= JP_EMPHASIS_NI;
ni2->next->jpEmphasis |= JP_EMPHASIS_NI;
ChangeToCombine(ni2, "ni");
DisconnectTOKEN(start, p);
} else if((prev->frPart & FR_PART_NOUN)
&& p->next) {
ChangeToCombine(p, "ni");
p->frPart = FR_PART_COMBINE_NOUN;
prev->jpEmphasis |= JP_EMPHASIS_NI;
p->next->jpEmphasis |= JP_EMPHASIS_NI;
} else if((prev->frPart & FR_PART_ADJECTIVE)
&& p->next) {
ChangeToCombine(p, "ni");
p->frPart = FR_PART_COMBINE_ADJECTIVE;
prev->jpEmphasis |= JP_EMPHASIS_NI;
p->next->jpEmphasis |= JP_EMPHASIS_NI;
}
}
static JP_PROADJECTIVE jpadj_NImporteQuel[] = {
JP_PROADJECTIVE(
FR_PART_ADJECTIVE_DEMONSTRATIVE,
"どんな", JP_KIND_NONE,
JP_PROP_CONDITION)
};
PROADJECTIVE proadjN_IMPORTE_QUELLE[] = {
{ "n'importe quel", FR_ATTRIB_NONE, FR_CHANGE_NONE, JPPROADJ_DIC(jpadj_NImporteQuel) },
};
static JP_PRONOUN jpnn_NImporteQuel[] = {
JP_PRONOUN( FR_ATTRIB_ALL, FR_ATTRIB_NONE,
JP_PROP_ALL, JP_PROP_NONE,
NULL,
"何", JP_EMPHASIS_DEMO, FR_PART_NOUN_INDEFINIT,
FR_ATTRIB_NONE, JP_PROP_THING, JP_UNIT_NONE
)
};
PRONOUN pronounN_IMPORTE_QUOI[] = {
{ "n'importe quoi", FR_ATTRIB_NONE, FR_SHORT_NONE, JPPRONOUN_DIC(jpnn_NImporteQuel) },
};
static JP_ADVERB jpadvN_IMPORTE_OU[] = {
JP_ADVERB("どこでも", JP_KIND_NONE, JP_PROP_PLACE, JP_PROP_ALL)
};
ADVERB advN_IMPORTE_OU[] = {
"n'importe o|", JPADVERB_DIC(jpadvN_IMPORTE_OU), NULL, NULL
};
//
// 'n'importe'を見分ける
//
void
Process_NIMPORTE(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(next == NULL) return;
FR_ATTRIB frAttrib = next->frAttrib;
char *str = GetTokenFrench(next);
if(!strcmp(str, "quel")
|| !strcmp(str, "quelle")
|| !strcmp(str, "quels")
|| !strcmp(str, "quelles")) {
ChangeToProadjective(p, proadjN_IMPORTE_QUELLE);
TOKEN *noun = SearchToken(FR_PART_NOUN_GENERAL, next);
if(noun)
noun->jpEmphasis |= JP_EMPHASIS_DEMO;
} else if(next->frPart == FR_PART_SPECIAL_QUOI) {
ChangeToPronoun(p, pronounN_IMPORTE_QUOI);
} else if(next->frPart == FR_PART_SPECIAL_OU) {
ChangeToAdverb(p, advN_IMPORTE_OU);
} else
return;
DisconnectTOKEN(start, next);
p->frAttrib = frAttrib;
}
//
// 'en'を見分ける
// 前置詞、en + ジェロンディフ
// 中性代名詞の処理はProcessObjectPronounで行う
void
Process_EN(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(next == NULL) return;
// en + 現在分詞 -> ジェロンディフ
if((next->frPart & FR_PART_VERB)
&& (next->frTense & FR_TENSE_P_PRESENT)) {
ChangeToPreposition(p, "en");
p->frPart = FR_PART_PREPOSIT_EN_ENT; // gerondif
}
if(IsObjectMatch(next, FR_PART_NOUN_ALL)
|| IsObjectMatch(next, FR_PART_NUMETRIC_ALL) // en 1998.
|| next->frPart == FR_PART_SPECIAL_QUI
|| next->frPart == FR_PART_SPECIAL_QUE
|| next->frPart == FR_PART_SPECIAL_QUOI) { // 前置詞
ChangeToPreposition(p, "en");
}
}
//
//
//
void
Process_EST(TOKEN *p)
{
ChangeToVerb(p, "]tre");
p->frAttrib = FR_ATTRIB_IL;
p->frTense = FR_TENSE_PRESENT;
}
//
// "FOIS"を見分ける
// 回、倍+比較級
//
void
Process_FOIS(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(next == NULL) return;
if(IsObjectMatch(prev, FR_PART_NUMETRIC_NUMBER)
&& (next->frAttrib & (FR_ATTRIB)(FR_ATTRIB_PLUS |FR_ATTRIB_MOINS))) {
ChangeToProadverb(p, "fois");
next->value = prev->value;
DisconnectTOKEN(start, prev);
DisconnectTOKEN(start, p);
} else {
ChangeToNoun(p, "fois");
}
isChanged = TRUE;
}
//
// 'peu'の処理
// un peu -> 少し
// peu -> ほとんど~ない
void
Process_PEU(TOKEN *start, TOKEN *prev, TOKEN *p)
{
if(prev->frPart == FR_PART_NUMETRIC_NUMBER
&& prev->value == 1) { // "un"か? GetTokenFrenchは使えない
DisconnectTOKEN(start, prev);
ChangeToAdverb(p, "peu"); // ChangeToProadverb(p, dic_UnPeu);
} else {
if( p->next
&& FlipAdjective(p->next)) {
DisconnectTOKEN(start, p);
} else {
ChangeToAdverb(p, "peu"); // ChangeToProadverb(p, dic_Peu);
p->jpProp |= JP_PROP_NEGATIVE;
}
}
}
//
// 'quand'を見分ける
// 疑問代名詞、接続詞
// vous ]tes @ Paris depuis quand? のように位置では判別できない
// ここでは、何も考えずに、2つの可能性を展開する
void
Process_QUAND(TOKEN *start, TOKEN *p)
{
TOKEN *altP = CopyCurrentTree(p, "Special Quand");
ChangeToQuestion(p, "quand");
ChangeToPreposition(altP, "quand");
isChanged = TRUE;
}
CMP_TOKEN pat_QuiDesNum[] = {
// on ne sait pas @ qui des deux s'adresser.
CMP_TOKEN( FR_PART_SPECIAL_QUI, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_SPECIAL_DES, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NUMETRIC_NUMBER,JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NONE)
};
//
// 'qui'を見分ける
// 疑問代名詞、関係代名詞
void
Process_QUI(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(p->frPartChoice & FR_PART_INTERROGATIVE) {
if(start == prev) { // 先頭にあるということは、疑問代名詞?
isChanged = TRUE;
ChangeToQuestion(p, "qui");
return;
}
if(IsPatternMatch(pat_QuiDesNum, p)) { // qui des deux -> 二人のうち誰か
TOKEN *num = p->next->next;
DisconnectTOKEN(start, p->next);
DisconnectTOKEN(start, num);
AddChildTOKEN(p, num);
ChangeToQuestion(p, "qui");
num->frPart = FR_PART_NUMETRIC_CHOICE;
num->jpUnit = p->jpUnit;
return;
}
// 目的代名詞を飛ばす eg) je ne sais @ qui des deux s'addresser.
TOKEN *verb = SearchToken(FR_PART_VERB_UNCLEAR, next);
if( verb
&& (verb->frTense & FR_TENSE_ORIGIN)) {
// je ne sais que faire. 原形独立文
TOKEN *altP = CopyCurrentTree(p, "Qui 1");
ChangeToQuestion(altP, "qui");
p->frPartChoice = (FR_PART)(p->frPartChoice & ~FR_PART_INTERROGATIVE);
}
}
if(next == NULL) return;
if((prev->frPart & FR_PART_NOUN)
&& (next->frPart & FR_PART_VERB)
&& next->which) { // 関係代名詞
p->frPart = FR_PART_RELATIVE_SUBJECT;
DisconnectTOKEN(start, p);
DisconnectTOKEN(start, next);
SelectJpVerb2(prev, next);
p->object1 = next;
AddChildTOKEN(prev, p);
}
if( p->preposition // la dame @ qui il parle.
&& (prev->frPart & FR_PART_NOUN)
&& (next->frPart & FR_PART_NOUN)
&& next->next
&& (next->next->frPart & FR_PART_VERB)) {
p->frPart = FR_PART_RELATIVE_OBJECT_N;
isChanged = TRUE;
}
}
//
// 'quoi'を見分ける
// 疑問代名詞、関係代名詞
void
Process_QUOI(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(start == prev) {
// 先頭にあるということは、疑問代名詞?
ChangeToQuestion(p, "quoi");
return;
}
if(next == NULL) return;
if( p->preposition
&& p->preposition->frPart == FR_PART_PREPOSIT_DE // de quoi manger. 何か食べるもの
&& next
&& IsObjectMatch(next, FR_PART_VERB_UNCLEAR)
&& next->frTense == FR_TENSE_ORIGIN) {
TOKEN *noun = PutNullNoun(), *subject = PutNullNoun();
noun->prtControl = PRT_CONTROL_ENABLE;
ChangeToPronoun(noun, "ce");
noun->jpProp = JP_PROP_THING;
ChangeToPronoun(subject, "on");
InsertTOKEN(prev, noun);
InsertTOKEN(p, subject);
p->frPart = FR_PART_RELATIVE_OBJECT_N;
return;
}
if((prev->frPart & FR_PART_NOUN)
&& (next->frPart & FR_PART_VERB)) { // 関係代名詞
if(next->which == NULL) {
SelectJpVerb1(next);
if(next->which == NULL) return;
}
p->frPart = FR_PART_RELATIVE_SUBJECT;
DisconnectTOKEN(start, p);
DisconnectTOKEN(start, next);
p->object2 = next;
AddChildTOKEN(prev, p);
return;
}
if( p->preposition // ce @ quoi je pense.
&& (next->frPart & FR_PART_NOUN)
&& next->next
&& IsObjectMatch(next->next, FR_PART_VERB_UNCLEAR)) {
if(!IsObjectMatch(prev, FR_PART_NOUN_DEMONSTRATIVE)) {
// C'est <ce> @ quoi je pense.
TOKEN *noun = PutNullNoun();
noun->prtControl = PRT_CONTROL_ENABLE;
ChangeToPronoun(noun, "ce");
InsertTOKEN(prev, noun);
}
p->frPart = FR_PART_RELATIVE_OBJECT_N;
isChanged = TRUE;
return;
}
}
//
// 'que'を見分ける
// 疑問代名詞、接続詞, 比較級(~よりも)
//
void
Process_QUE(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(prev->frPart == FR_PART_INTERROGATIVE_UNCLEAR) {
// Combien que de d{fauts il a! ->感嘆文
return;
}
// Jacques est plus actif <que> Louise. ~よりも
TOKEN *lastCmp = NULL; // 比較級を用いた個所
for(TOKEN *q = start; q && q != p; q = q->next) {
TOKEN *cmp = IsWordOwner(q, FR_ATTRIB_COMPARE);
if(cmp) lastCmp = cmp; // 一番最後の比較級
}
if(lastCmp
&& (p->frPartChoice & FR_PART_CONJUNCTION)) {
CopyCurrentTree(p, "Que 2", FR_PART_CONJUNCTION);
p->frPart = FR_PART_CONJUNCTION_THAN;
return;
}
if(p->frPartChoice & FR_PART_INTERROGATIVE) {
// 先頭にあるということは、疑問代名詞?
if((start == prev || prev->frPart == FR_PART_SPECIAL_COMMA)
// 先頭にあっても eg) Qu'il parte imm{diatement!
&& (currentTree->punctuation & FR_PUNCT_QUESTION)) {
ChangeToQuestion(p, "que");
return;
}
// 目的代名詞を飛ばす eg) je ne sais que <lui> r{pondre.
TOKEN *verb = SearchToken(FR_PART_VERB_UNCLEAR, next);
if( verb
&& (verb->frTense & FR_TENSE_ORIGIN)) {
// je ne sais que faire. 原形独立文
TOKEN *altP = CopyCurrentTree(p, "Que 3");
ChangeToQuestion(altP, "que");
p->frPartChoice = (FR_PART)(p->frPartChoice & ~FR_PART_INTERROGATIVE);
}
}
// ne ... que ~ ~しか
/* if( prev
&& (prev->frPart & FR_PART_VERB)
*/
if( SearchToken(JP_PROP_NEGATIVE, start, p)
&& next
&& (next->frPart & (FR_PART)(FR_PART_NOUN | FR_PART_PREPOSIT))
&& (p->frPartChoice & FR_PART_ADVERB)) {
CopyCurrentTree(p, "Que 4", FR_PART_ADVERB);
next->jpEmphasis |= JP_EMPHASIS_ONLY;
DisconnectTOKEN(start, p);
return;
}
if(((prev->frPart & FR_PART_NOUN)
|| ((prev->frPart & FR_PART_PREPOSIT) && p->object1 == NULL))
&& (p->frPartChoice & FR_PART_RELATIVE)) {
TOKEN *verb = p;
while(verb) {
verb = SearchToken(FR_PART_VERB_UNCLEAR, verb->next);
if(verb == NULL) break;
// 他動詞見つけた
if(!IsAlwaysIntransitiveVerb(verb)) {
TOKEN *altP = CopyCurrentTree(p, "Que 5");
altP->frPart = FR_PART_RELATIVE_OBJECT_N;
break;
}
}
if(verb == NULL
&&(prev->jpProp & JP_PROP_TIME)) {
// Quatre jours que je marche. 動詞の目的語でなくても、関係代名詞になる
TOKEN *altP = CopyCurrentTree(p, "Que 6");
altP->frPart = FR_PART_RELATIVE_OBJECT; // RELATIVE_OBJECT_N;
}
}
if(next
&& next->frPart == FR_PART_SPECIAL_DE) {
ChangeToQuestion(p, "que");
return;
}
// 接続詞 <~ということ>
if(IsObjectMatch(next, FR_PART_SENTENCE_NORMAL)
&& (p->frPartChoice & FR_PART_VERB)) {
DisconnectTOKEN(start, p);
next->frPart = FR_PART_SENTENCE_QUE;
if(next->subject)
next->subject->jpEmphasis |= JP_EMPHASIS_GA;
if(p->preposition)
InsertTOKEN(prev, p->preposition);
}
}
//
// 'o|'を見分ける
// 疑問副詞、関係副詞
void
Process_OU(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(next == NULL) return;
if(start == prev) {
// 先頭にあるということは、疑問代名詞?
ChangeToQuestion(p, "o|");
return;
}
if(prev->frPart & FR_PART_COMBINE) {
// Mais, o| sont neiges?
TOKEN *altP = CopyCurrentTree(p, "Ou 1");
altP->frPart = FR_PART_RELATIVE_ADVERB;
ChangeToQuestion(p, "o|");
return;
}
if((prev->frPart & FR_PART_NOUN)
&& (prev->jpProp & (JP_PROP)(JP_PROP_TIME | JP_PROP_PLACE))
&& (next->frPart & FR_PART_NOUN)) { // 関係副詞
p->frPart = FR_PART_RELATIVE_ADVERB;
isChanged = TRUE;
return;
}
}
//
// 'plus'を見分ける
// 形容詞、比較を作る副詞
// (比較級は、CombinePlusAdjectiveで処理されている)
//
void
Process_PLUS(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(prev
&& IsObjectMatch(prev, FR_PART_ARTICLE_PRONOUN)
&& (prev->frAttrib & FR_ATTRIB_SINGLE)) { // le plus
ChangeToProadverb(p, "plus");
p->frAttrib = (FR_ATTRIB)(p->frAttrib | FR_ATTRIB_PLUS);
return;
}
if(next == NULL
|| IsObjectMatch(next, (FR_PART)(FR_PART_ADJECTIVE_ALL | FR_PART_ADVERB_ALL)) == NULL) {
TOKEN *altP = CopyCurrentTree(p, "Plus 1");
ChangeToProadverb(altP, "plus");
altP->frAttrib = (FR_ATTRIB)(altP->frAttrib | FR_ATTRIB_PLUS);
}
// elle n'est plus jeune.
ChangeToAdverb(p, "plus");
}
//
// <s'>を見分ける
// <se> or <si> エリジオン
void
Process_S(TOKEN *start, TOKEN *p)
{
TOKEN *altP = CopyCurrentTree(p, "S 1");
ChangeToPronoun(p, "se");
ChangeToPreposition(altP, "si");
isChanged = TRUE;
}
//
// 'si'を見分ける
// 接続詞、疑問詞
void
Process_SI(TOKEN *start, TOKEN *p)
{
if(start->next == p
&& (p->next == NULL || p->next->frPart == FR_PART_SPECIAL_COMMA)) {
// Si, j'ai une voiture.
ChangeToInterjection(p, "si");
} else {
ChangeToPreposition(p, "si");
}
isChanged = TRUE;
}
//
// 'seulement'を処理する
// 本当は、副詞だが、次のTokenのjmEmphasisに取り込む
//
void
Process_SEULEMENT(TOKEN *start, TOKEN *p)
{
TOKEN *next = p->next;
if(next == NULL) return;
if(next->frPart &
(FR_PART)(FR_PART_NOUN | FR_PART_PREPOSIT | FR_PART_ADVERB | FR_PART_ADJECTIVE)) {
DisconnectTOKEN(start, p);
next->jpEmphasis |= JP_EMPHASIS_SEULEMENT;
}
}
BOOL
IsAttribSingle(TOKEN *p)
{
if((p->frAttrib & FR_ATTRIB_SINGLE)
&& SearchToken(FR_PART_ARTICLE_DEFINIT, p->child))
return(TRUE);
return(FALSE);
}
static JP_ADVERB jpToutDeSuite[] = {
JP_ADVERB("すぐ", JP_KIND_KEIYODOSHI, JP_PROP_TIME, JP_PROP_ALL)
};
ADVERB adv_ToutDeSuite[] = {
"tout de suite",
JPADVERB_DIC(jpToutDeSuite),
NULL,
NULL
};
CMP_TOKEN pat_ToutDeSuite[] = {
// tout de suite
CMP_TOKEN( FR_PART_SPECIAL_TOUT, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_SPECIAL_DE, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NOUN_GENERAL, "suite" ),
CMP_TOKEN( FR_PART_NONE)
};
JP_PRONOUN jpToutLeMonde[] = {
JP_PRONOUN( FR_ATTRIB_ALL, FR_ATTRIB_NONE,
JP_PROP_ALL, JP_PROP_NONE,
NULL,
"全員", JP_EMPHASIS_GA, FR_PART_NOUN_POSSESIVE,
FR_ATTRIB_IL, JP_PROP_HUMAN, JP_UNIT_HITO
)
};
PRONOUN pronoun_ToutLeMonde[] = {
{ "tout le monde", FR_ATTRIB_IL, FR_SHORT_NONE, JPPRONOUN_DIC(jpToutLeMonde) }
};
CMP_TOKEN pat_ToutLeMonde[] = {
// tout le monde.
CMP_TOKEN( FR_PART_SPECIAL_TOUT, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NOUN_GENERAL, "monde" ),
CMP_TOKEN( FR_PART_NONE)
};
BOOL
HasPluralArticleDay(TOKEN *p)
{
TOKEN *article = SearchToken(FR_PART_ARTICLE_DEFINIT, p->child);
if( article == NULL
|| !(article->frAttrib & FR_ATTRIB_PLURAL))
return(FALSE);
if(IsDayName(p))
return(TRUE);
return(FALSE);
}
BOOL
HasRelativeQue(TOKEN *p)
{
if(SearchToken(FR_PART_RELATIVE_OBJECT, p->child))
return(TRUE);
return(FALSE);
}
static JP_PROADJECTIVE jpadj_TousLesDays[] = {
JP_PROADJECTIVE(
FR_PART_ADJECTIVE_DEMONSTRATIVE,
"毎週", JP_KIND_NONE,
JP_PROP_CONDITION)
};
PROADJECTIVE proadj_TousLesDays[] = {
{ "tous", FR_ATTRIB_NONE, FR_CHANGE_NONE, JPPROADJ_DIC(jpadj_TousLesDays) },
};
CMP_TOKEN pat_TousLesDays[] = {
// tous les dimanches. -> 毎週月曜日
CMP_TOKEN( FR_PART_SPECIAL_TOUT, JP_PROP_NONE, NULL ),
CMP_TOKEN( FR_PART_NOUN_GENERAL, JP_PROP_NONE, HasPluralArticleDay),
CMP_TOKEN( FR_PART_NONE)
};
CMP_TOKEN pat_ToutNouns[] = {
// tout jours. -> どの日も(毎日)
CMP_TOKEN( FR_PART_SPECIAL_TOUT, JP_PROP_NONE, NULL ),
CMP_TOKEN( FR_PART_NOUN_GENERAL, JP_PROP_NONE, HasNoArticlePossesive),
CMP_TOKEN( FR_PART_NONE)
};
CMP_TOKEN pat_ToutLeNoun[] = {
// tout la journ{e. -> 一日の全て(一日中)
CMP_TOKEN( FR_PART_SPECIAL_TOUT, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NOUN_GENERAL, JP_PROP_NONE, IsAttribSingle),
CMP_TOKEN( FR_PART_NONE)
};
CMP_TOKEN pat_ToutLeNouns[] = {
// tout les jours. -> 全ての一日(毎日)
CMP_TOKEN( FR_PART_SPECIAL_TOUT, JP_PROP_NONE, NULL ),
CMP_TOKEN( FR_PART_NOUN_GENERAL, JP_PROP_NONE, HasPluralArticlePossesive),
CMP_TOKEN( FR_PART_NONE)
};
CMP_TOKEN pat_ToutCeQue[] = {
// tout ce que je as observ{. -> 君が観察したことの全て
CMP_TOKEN( FR_PART_SPECIAL_TOUT, JP_PROP_NONE, NULL ),
CMP_TOKEN( FR_PART_NOUN_IMPERSONAL,JP_PROP_NONE, HasRelativeQue, "ce"),
CMP_TOKEN( FR_PART_NONE)
};
CMP_TOKEN pat_TousLesNum[] = {
// tous les deux. -> 二人・二つ共
CMP_TOKEN( FR_PART_SPECIAL_TOUT, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_ARTICLE_DEFINIT, JP_PROP_NONE, IsAttribPlural),
CMP_TOKEN( FR_PART_NUMETRIC_NUMBER, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NONE)
};
//
// <TOUT>を見分ける
// 不定代名詞、形容詞、副詞
void
Process_TOUT(TOKEN *start, TOKEN *prev, TOKEN *p)
{
if(IsPatternMatch(pat_ToutDeSuite, p)) {
DisconnectTOKEN(start, p->next->next);
DisconnectTOKEN(start, p->next);
ChangeToAdverb(p, adv_ToutDeSuite);
} else if(IsPatternMatch(pat_ToutLeMonde, p)) {
// DisconnectTOKEN(start, p->next->next);
DisconnectTOKEN(start, p->next);
ChangeToPronoun(p, pronoun_ToutLeMonde);
} else if(IsPatternMatch(pat_TousLesDays, p)) {
TOKEN *noun = p->next;
TOKEN *article = SearchToken(FR_PART_ARTICLE_DEFINIT, noun->child);
if(article) article->prtControl = PRT_CONTROL_DISABLE; // 冠詞を消す
ChangeToProadjective(p, proadj_TousLesDays);
AttachAdjective(start, noun, p, FR_LOCATION_FRONT);
} else if(IsPatternMatch(pat_ToutNouns, p)) {
if(prev->frPart & FR_PART_VERB) {
// Nous sommes tout Japonais. 私達は<みな>日本人です。
ChangeToProadverb(p, *(char **)p->what);
} else {
TOKEN *noun = p->next;
ChangeToProadjective(p, *(char **)p->what);
DisconnectTOKEN(start, p);
AttachAdjective(start, noun, p, FR_LOCATION_FRONT);
noun->jpEmphasis = JP_EMPHASIS_MO;
}
} else if(IsPatternMatch(pat_ToutNouns, p)) {
TOKEN *noun = p->next;
DisconnectTOKEN(start, noun);
AddChildTOKEN(p, noun);
SelectJpNoun(NULL, noun, noun, JP_PROP_ALL);
p->jpProp = noun->jpProp | JP_PROP_VOLUME;
} else if(IsPatternMatch(pat_ToutCeQue , p)) {
// tout ce que je as observ{. -> 君が観察したことの全て
TOKEN *noun = p->next;
ChangeToPronoun(p, *(char **)p->what);
DisconnectTOKEN(start, noun);
AddChildTOKEN(p, noun);
SelectJpNoun(NULL, p, p, JP_PROP_ALL);
p->jpProp = noun->jpProp | JP_PROP_VOLUME;
} else if(IsPatternMatch(pat_ToutLeNoun, p)) {
TOKEN *noun = p->next;
ChangeToPronoun(p, *(char **)p->what);
DisconnectTOKEN(start, noun);
AddChildTOKEN(p, noun);
SelectJpNoun(NULL, p, p, JP_PROP_ALL);
p->jpProp = noun->jpProp | JP_PROP_VOLUME;
} else if(IsPatternMatch(pat_ToutLeNouns, p)) {
TOKEN *noun = p->next;
TOKEN *article = SearchToken(FR_PART_ARTICLE_DEFINIT, noun->child);
if(article == NULL)
article = SearchToken(FR_PART_ADJECTIVE_POSSESIVE, noun->child);
if(article) article->prtControl = PRT_CONTROL_DISABLE; // 冠詞を消す
ChangeToAdjective(p, *(char **)p->what);
AttachAdjective(start, noun, p, FR_LOCATION_FRONT);
// DisconnectTOKEN(start, p);
// AddChildTOKEN(noun, p);
} else if(IsPatternMatch(pat_TousLesNum, p)) {
TOKEN *article = p->next;
TOKEN *num = article->next;
DisconnectTOKEN(start, num);
DisconnectTOKEN(start, article);
p->value = num->value;
ChangeToProadverb(p, *(char **)p->what);
} else if(p->next
&& IsTokenFrench(p->next, "ce")) {
// 変な候補を増やさない
return;
} else if(p->frPartChoice & FR_PART_NOUN) {
TOKEN *altP = CopyCurrentTree(p, "Tout 1", FR_PART_NOUN);
ChangeToPronoun(p, *(char **)p->what);
} else if(p->frPartChoice & FR_PART_ADVERB) {
// Nous sommes tout Japonais.
TOKEN *altP = CopyCurrentTree(p, "Tout 3", FR_PART_ADVERB);
ChangeToProadverb(p, *(char **)p->what);
}
}
//
// FR_PART_SPECIALを 解析結果に変換する
//
void
ConvertSpecialWord(TOKEN *p, FR_PART frPart)
{
switch(p->frPart) {
case FR_PART_SPECIAL_DE: // 不定冠詞、部分冠詞、前置詞(infを導く)、形容詞をともなう冠詞、否定冠詞
if(frPart == FR_PART_PREPOSIT_DE) {
TOKEN *next = p->next;
ChangeToPreposition(p, "de");
p->which = (void *)&dic_jpr_de[0];
if(!IsObjectMatch(next, FR_PART_NOUN_ALL))
PrintInternalError( "Internal Error <ConvertSpecialWord> -2-\n");
if(SelectJpPreposition1(p, next)) {
DisconnectTOKEN(p, next);
p->object1 = next;
}
} else if(frPart == FR_PART_PREPOSIT_DE_INF) {
ChangeToPreposition(p, dic_DeInf);
} else if(frPart & FR_PART_ADJECTIVE) {
PrintInternalError( "Internal Error <ConverSpecialWord 2>\n");
} else goto Error;
break;
case FR_PART_SPECIAL_EN: // 前置詞、中性代名詞、en + ジェロンディフ
if(frPart & FR_PART_NOUN) {
ChangeToObjectPronoun(p, "en");
p->frPart = frPart; // (FR_PART)(FR_PART_NOUN_OBJECT_D | FR_PART_NOUN_OBJECT_I);
} else if(frPart == FR_PART_PREPOSIT_DE) {
ChangeToPreposition(p, "de");
} else goto Error;
break;
case FR_PART_SPECIAL_LEUR:
goto Error;
default:
return;
}
isChanged = TRUE;
return;
Error:
PrintInternalError( "Internal Error <ConvertSpecialWord>");
}
//
// 中性代名詞 y, enの<それ>
//
JP_PRONOUN dic_IndicatingNoun[] = {
JP_PRONOUN( FR_ATTRIB_ALL, FR_ATTRIB_NONE,
JP_PROP_ALL, JP_PROP_NONE,
NULL,
"それ", JP_EMPHASIS_NONE, FR_PART_NOUN_OBJECT_BOTH,
FR_ATTRIB_ALL, JP_PROP_ALL, JP_UNIT_TSU)
};
PRONOUN dic_indicationg_noun =
{
"中性代名詞よーん",
FR_ATTRIB_ALL, FR_SHORT_NONE,
JPPRONOUN_DIC(dic_IndicatingNoun)
};
//
// 中性代名詞 y, enの<そこ> j'vais
//
JP_PRONOUN dic_IndicatingNounPlace[] = {
JP_PRONOUN( FR_ATTRIB_ALL, FR_ATTRIB_NONE,
JP_PROP_ALL, JP_PROP_NONE,
NULL,
"そこ", JP_EMPHASIS_NONE, FR_PART_NOUN_OBJECT_I,
FR_ATTRIB_ALL, JP_PROP_ALL, JP_UNIT_TSU
)
};
PRONOUN dic_indicationg_noun_place =
{
"中性代名詞よーん",
FR_ATTRIB_ALL, FR_SHORT_NONE,
JPPRONOUN_DIC(dic_IndicatingNounPlace)
};
//
// en, y(中性代名詞)をdeや@で受けた場合
//
void
ChangeProperObject(TOKEN *p, FR_PART frPart, JP_PROP jpProp)
{
if(p->frPart & FR_PART_SPECIAL) {
ConvertSpecialWord(p, frPart);
} else if(frPart == FR_PART_PREPOSIT_DE
&& IsTokenFrench(p, "en")) {
ChangeToPreposition(p, "de");
TOKEN *noun = PutNullNoun(FR_PART_NOUN_OBJECT_BOTH, PRT_CONTROL_ENABLE);
ChangeToPronoun(noun, &dic_indicationg_noun);
CombinePrepositionObject(p, p, noun);
} else if(frPart == FR_PART_PREPOSIT_A
&& p->frPart == FR_PART_ADVERB_Y) {
ChangeToPreposition(p, "@");
TOKEN *noun = PutNullNoun(FR_PART_NOUN_OBJECT_BOTH, PRT_CONTROL_ENABLE);
p->jpProp = jpProp;
if((jpProp & JP_PROP_PLACE) && jpProp != JP_PROP_ALL)
ChangeToPronoun(noun, &dic_indicationg_noun_place);
else
ChangeToPronoun(noun, &dic_indicationg_noun);
CombinePrepositionObject(p, p, noun);
}
}
//
// 一通り解析しても分からなかったもの
//
void
ProcessSpecialWord2(TOKEN *start)
{
TOKEN *prev = start;
TOKEN *p;
for(p = start->next; p; p = p->next) {
switch(p->frPart) {
case FR_PART_SPECIAL_AUSSI: Process2_AUSSI(start, prev, p); break;
case FR_PART_SPECIAL_COMMA: Process2_COMMA(start, prev, p); break;
case FR_PART_SPECIAL_DE: Process2_DE(start, prev, p); break;
// case FR_PART_SPECIAL_DES: Process2_DES(start, prev, p); break;
case FR_PART_SPECIAL_ESTCEQUE: Process2_EstCeQue(start, prev, p); break;
}
prev = p;
}
}
//
// aussiを見分ける
//
void
Process2_AUSSI(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(prev
&& prev->frPart & FR_PART_NOUN) {
prev->jpEmphasis |= JP_EMPHASIS_MO;
DisconnectTOKEN(start, p);
}
else if( next
&& (next->frPart & FR_PART_ADVERB_ADJECTIVE)) {
next->frAttrib = (FR_ATTRIB)(next->frAttrib | FR_ATTRIB_AUSSI);
DisconnectTOKEN(start, p);
}
}
void
Process2_COMMA(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(next == NULL) return;
if((prev->frPart & FR_PART_COMBINE)
&& prev->object2 == NULL) {
// Mais, o| est les neiges d'antan?
DisconnectTOKEN(start, p);
next->punctuation = FR_PUNCT_COMMA;
} else if((next->frPart & FR_PART_COMBINE)
&& next->object1 == NULL) {
if(next->object2 != NULL) {
// , mais SV, , car SV
DisconnectTOKEN(start, p);
next->punctuation = FR_PUNCT_COMMA;
}
}
}
CMP_TOKEN pat_DeSentence1[] = {
// d'une main tremblente, il a ouvert la bo^te.\j'
CMP_TOKEN( FR_PART_SPECIAL_DE, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NOUN_ALL, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_SPECIAL_COMMA, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_SENTENCE_ALL, JP_PROP_NONE, IsLastToken),
CMP_TOKEN( FR_PART_NONE)
};
CMP_TOKEN pat_DeSentence2[] = {
// d'une main tremblente il a ouvert la bo^te.'
CMP_TOKEN( FR_PART_SPECIAL_DE, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NOUN_ALL, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_SENTENCE_ALL, JP_PROP_NONE, IsLastToken),
CMP_TOKEN( FR_PART_NONE)
};
CMP_TOKEN pat_DeSentence3[] = {
// On peut voir la montagne de la fenetre.
CMP_TOKEN( FR_PART_SENTENCE_ALL, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_SPECIAL_DE, JP_PROP_NONE, NULL),
CMP_TOKEN( FR_PART_NOUN_ALL, JP_PROP_NONE, IsLastToken ),
CMP_TOKEN( FR_PART_NONE)
};
//
// 'de'を見分ける(その2)
// 冠詞 + 形容詞 + 複数名詞 ?, 部分冠詞? 否定冠詞?
void
Process2_DE(TOKEN *start, TOKEN *prev, TOKEN *p)
{
if(start->next == p) {
if(IsPatternMatch(pat_DeSentence1, p)
|| IsPatternMatch(pat_DeSentence2, p))
ChangeToPreposition(p, "de");
} else if(IsPatternMatch(pat_DeSentence3, prev)) {
ChangeToPreposition(p, "de");
}
}
//
// 'des'を見分ける(その2)
// 不定冠詞?
void
Process2_DES(TOKEN *start, TOKEN *prev, TOKEN *p)
{
TOKEN *next = p->next;
if(next
&& IsObjectMatch(next, FR_PART_NOUN_GENERAL)
&& (next->frAttrib & FR_ATTRIB_PLURAL)
// まだ、冠詞を持っていないこと
&& SearchToken(FR_PART_ARTICLE_ALL, next->child) == NULL) {
// 'des' petits livres -> 'de' petits liveresのはず
if(SearchToken(FR_PART_ADJECTIVE_GENERAL_F, next->child) == NULL
&& (p->frPartChoice & FR_PART_ARTICLE)) {
// 不定冠詞
if(!(next->jpProp & JP_PROP_PARTIAL)) // 問答無用
CopyCurrentTree(p, "Des 1", FR_PART_ARTICLE);
ChangeToArticle(p, "des");
} else if(p->frPartChoice & FR_PART_PREPOSIT) {
if(prev
// etreの後には、縮約冠詞がこないような気が...
&& !strcmp(GetTokenFrench(prev), "]tre")) {
currentTree->prtControl = PRT_CONTROL_DISABLE;
} else {
// 縮約冠詞 ( des -> de + les )
PutToken(FR_PART_ARTICLE_DEFINIT,
(FR_ATTRIB)(FR_ATTRIB_BOTH_SEX | FR_ATTRIB_PLURAL | FR_ATTRIB_LEVEL3),
JP_PROP_NONE, NULL);
InsertTOKEN(p, lastToken);
ChangeToSpecial(p, "de");
ChangeToArticle(lastToken, "les");
}
}
}
}
//
//
//
void
Process2_EstCeQue(TOKEN *start, TOKEN *prev, TOKEN *p)
{
if(p->next == NULL
|| !(currentTree->punctuation & FR_PUNCT_QUESTION)) return;
if((p->next->frPart & FR_PART_NOUN)
&& p->next->next
&& (p->next->next->frPart & FR_PART_VERB)) {
p->next->next->jpProp |= JP_PROP_QUESTION;
DisconnectTOKEN(start, p);
} else if(IsObjectMatch(p->next, FR_PART_SENTENCE_ALL)
&& !(p->next->jpProp & JP_PROP_QUESTION)) {
TOKEN *sentence = p->next;
if(sentence->object2)
sentence->object2->jpProp |= JP_PROP_QUESTION; // 動詞がある場合
else
p->next->jpProp |= JP_PROP_QUESTION;
DisconnectTOKEN(start, p);
}
}